package com.naiterui.ehp.bs.emr.service;

import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import com.naiterui.common.repository.page.PageVO;
import com.naiterui.ehp.bp.bo.ca.EmrSignBO;
import com.naiterui.ehp.bp.bo.emr.DrRecordIdBO;
import com.naiterui.ehp.bp.bo.emr.InquireCaseBO;
import com.naiterui.ehp.bp.bo.emr.MedicalRecordBO;
import com.naiterui.ehp.bp.bo.emr.MedicalRecordDoctorBO;
import com.naiterui.ehp.bp.bo.emr.MedicalRecordIdBO;
import com.naiterui.ehp.bp.bo.emr.MedicalRecordScreenBO;
import com.naiterui.ehp.bp.bo.emr.RecordRecomIdBO;
import com.naiterui.ehp.bp.bo.emr.params.DrCaseParams;
import com.naiterui.ehp.bp.bo.emr.params.RevisitNoticeParamBO;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.emr.vo.CaseInitVO;
import com.naiterui.ehp.bs.emr.vo.DrCaseInvalidVO;
import com.naiterui.ehp.bs.emr.vo.DrRecordVO;
import com.naiterui.ehp.bs.emr.vo.PatientOrDoctorCaseVO;
import com.naiterui.ehp.bs.emr.vo.RecordTemplateVO;
import com.naiterui.ehp.bs.emr.vo.SaveCaseVO;
import com.naiterui.ehp.bs.emr.vo.SendCaseVO;

/**
 * @author guoyongxiang
 */
public interface IDrCaseService {

    /**
     * 填写病历页初始化信息
     * IDrCaseService.initCase()
     *
     * @param doctorId
     * @param patientId
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年5月29日
     * @since 1.0.0
     */
    CaseInitVO initCase(Long doctorId, Long patientId, Long inquirerId) throws BusinessException;

    /**
     * 多图上传
     * IDrCaseService.updateFiles()
     *
     * @param files
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年5月30日
     * @since 1.0.0
     */
    List<String> uploadFiles(Long doctorId, MultipartFile[] files) throws BusinessException;

    /**
     *
     * <pre>
     *     保存医生填写病历
     *     调用签名服务生成pdf文件并获取签名unionId
     * </pre>
     *
     * IDrCaseService.saveDrMedicalRecord()
     *
     * @param params
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年5月30日
     * @since 1.0.0
     */
    SaveCaseVO saveDrMedicalRecord(DrCaseParams params, Boolean send, Integer requestFrom) throws BusinessException;

    /**
     * <pre>
     *     医师签名
     * </pre>
     *
     * @param recordId
     * @param doctorId
     * @param uniqueId 人脸识别唯一标识
     * @throws BusinessException
     */
    void sign(String recordId, Long doctorId, String uniqueId, String pin, Integer requestFrom)
        throws BusinessException;

    /**
     * <pre>
     *      确认发送病例
     *      签名成功的通知由签名服务维护——生成签名记录
     * </pre>
     * @param caseId 病例Id
     * @param doctorId 医生id
     * @param force 是否强制发送
     * @param send 是否发送
     * @return
     * @throws BusinessException
     */
    SendCaseVO confirm(String caseId, Long doctorId, Boolean force, Integer consultType, Long consultId, Boolean send) throws BusinessException;

    /**
     * 更新签名信息
     * @param bo
     * @throws BusinessException
     */
    void updateSignInfo(EmrSignBO bo) throws BusinessException;

    /**
     * 分页查询病历列表
     * IDrCaseService.getMedicalRecordList()
     *
     * @param doctorId
     * @param patientId
     * @param page
     * @param relation
     * @param inquirerId  就诊人id
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年5月31日
     * @since 1.0.0
     */
    PageVO<DrRecordVO> getMedicalRecordList(Long doctorId, Long patientId, Integer page, Integer num, Integer relation, Long inquirerId) throws BusinessException;

    /**
     * 根据病例记录id返回数据(只返回患者发送病历和医生填写病历，如果还有其它类型，在方法中扩展)
     * IDrCaseService.getPtOrDrMedicalRecord()
     *
     * @param id
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年5月31日
     * @since 1.0.0
     */
    PatientOrDoctorCaseVO getPtOrDrMedicalRecord(String id) throws BusinessException;

    /**
     * 查询最近本人病历id(医生填写病历和患者发送病历)
     * IDrCaseService.getMedicalRecordId()
     *
     * @param doctorId
     * @param patientId
     *
     * @return
     *
     * @Author lichaopi
     * @Date 2018年5月31日
     * @since 1.0.0
     */
    MedicalRecordIdBO getMedicalRecordId(Long doctorId, Long patientId);

    /**
     * bo转换病历记录并保存
     * IDrCaseService.addMedicalRecordByBO()
     *
     * @param bo
     *
     * @since 1.0.0
     */
    void addMedicalRecordByBO(MedicalRecordBO bo);

    /**
     * 查询筛选条件列表
     * IDrCaseService.getMrScreeenBOList()
     *
     * @param doctorId
     * @param patientId
     *
     * @return
     *
     * @Author lichaopi
     * @Date 2018年6月1日
     * @since 1.0.0
     */
    List<MedicalRecordScreenBO> getScreenList(Long doctorId, Long patientId);

    /**
     * 通知患者和医生复诊
     * IDrCaseService.notifyRevisit()
     *
     * @Author lichaopi
     * @Date 2018年6月1日
     * @since 1.0.0
     */
    void notifyRevisit(Long dId);

    /**
     * 保存病历为暂存
     * IDrCaseService.saveDrRecordTemporary()
     *
     * @param params
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年6月27日
     * @since 1.0.0
     */
    DrRecordIdBO saveDrRecordTemporary(DrCaseParams params) throws BusinessException;

    /**
     * 查询医生填写病历Bo,判断推荐是否包含病历
     * IDrCaseService.getDrRecordBOMessage()
     *
     * @param recommendId
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年6月28日
     * @since 1.0.0
     */
    MedicalRecordDoctorBO getDrRecordBOMessage(Long recommendId);

    /**
     * 更新病历状态(处方调用)
     * IDrCaseService.updateDrCase()
     * *
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年6月28日
     * @since 1.0.0
     */
    void updateDrCase(String recordId) throws BusinessException;

    /**
     * 获取患者医嘱提醒信息
     * IDrCaseService.getRevisitInfo()
     *
     * @param revisitNoticeParamBO
     *
     * @Date 2018年6月28日
     * @since 2.19
     */
    boolean getRevisitInfo(RevisitNoticeParamBO revisitNoticeParamBO);

    /**
     * 查询最近病历（患者发送病历或医生填写病历）
     * IDrCaseService.getLateRecord()
     *
     * @param doctorId
     * @param patientId
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年6月30日
     * @since 1.0.0
     */
    PatientOrDoctorCaseVO getLateRecord(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 根据推荐id列表查询病历id列表
     * IDrCaseService.getRecordRecomIdBO()
     *
     * @param recomIdList
     *
     * @return
     *
     * @throws BusinessException
     * @Author lichaopi
     * @Date 2018年6月30日
     * @since 1.0.0
     */
    List<RecordRecomIdBO> getRecordRecomIdBO(List<Long> recomIdList);

    /**
     * 通过医生ID推荐ID更新处方失效状态
     *
     * @param doctorId      医生ID
     * @param recommendId   推荐ID
     * @param invalidStatus 失效状态 0：正常  1：失效
     */
    void updatePrescriptionStatus(Long doctorId, Long recommendId, Integer invalidStatus);

    /**
     * 通过医生ID，病历id更新病历状态
     *
     * @param doctorId      医生ID
     * @param recordId      病历ID
     * @param invalidStatus 失效状态 0：正常  1：失效
     */
    DrCaseInvalidVO updateDrCaseStatus(Long doctorId, String recordId, Integer invalidStatus) throws BusinessException;

    /**
     * 查询病历模板
     */
    List<RecordTemplateVO> getTemplateList();

    /**
     * 获取患者首聊：病情描述、病历描述文案
     *
     * @param doctorId
     * @param patientId
     * @param type
     * @param recordId
     *
     * @return
     */
    String getDiseaseContent(Long doctorId, Long patientId, Long inquirerId, Integer type, String recordId);

    Boolean getCaseExist(Long patientId, Long doctorId);

    /**
     * 获取病例诊断
     * @param recordId
     * @return
     */
    InquireCaseBO inquirerCaseInfo(String recordId) throws BusinessException;

}